Python中yield怎么用? 和return有什么区别

您所在的位置:网站首页 yield 和 return的区别 Python中yield怎么用? 和return有什么区别

Python中yield怎么用? 和return有什么区别

2023-05-11 17:12| 来源: 网络整理| 查看: 265

self.prev = 0

self.cur = 1

self.n = n

def__iter__(self):

returnself

def__next__(self):

ifself.n > 0:

value = self.cur

self.cur = self.cur + self.prev

self.prev = value

self.n -= 1

returnvalue

else:

raiseStopIteration

f = Fib( 10)

print([i fori inf]) # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

什么是生成器

普通函数用 return返回一个值,在 Python 中还有一种函数,用关键字 yield来返回值,这种函数叫生成器函数,函数被调用时会返回一个生成器对象而不是yield后面的值。

生成器本质上还是一个迭代器,也是用在迭代操作中,因此它有和迭代器一样的特性,唯一的区别在于实现方式上不一样,后者更加简洁

最简单的生成器函数:

>>> deffunc(n):

... yieldn* 2

...

>>> func

>>> g = func( 5)

>>> g

>>>

func 就是一个生成器函数,调用该函数时返回对象就是生成器 g ,这个生成器对象的行为和迭代器是非常相似的,可以用在 for 循环等场景中。注意 yield 对应的值在函数被调用时不会立刻返回,而是调用next方法时才返回

>>> g = func( 5)

>>> next(g)

10

>>> g = func( 5)

>>> fori ing:

... print(i)

...

10

一个函数中可以有多个yield语句,有几个yield语句有可以迭代几次。

defgenerate:

yield1

yield2

yield3

g = generate

print(next(g)) # 1

print(next(g)) # 2

print(next(g)) # 3

print(next(g)) # 报错 StopIteration

那为什么要用生成器呢?显然,它没有那么多冗长代码了,而且性能上一样的高效,为什么不用呢?来看看用生成器实现斐波那契数列有多简单。

deffib(n):

prev, curr = 0, 1

whilen > 0:

n -= 1

yieldcurr

prev, curr = curr, curr + prev

print([i fori infib( 10)])

#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

生成器表达式

我曾经介绍过列表推导式(list comprehension),生成器表达式与列表推导式长的非常像,但是它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象。

>>> g = (x* 2forx inrange( 10))

>>> type(g)

>>> l = [x* 2forx inrange( 10)]

>>> type(l)

前面已经介绍过生成器的优势,就是迭代海量数据时,显然生成器更合适。

---END---

推荐↓↓↓返回搜狐,查看更多



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3